package com.rn.ddd.infrastructure.engine;

import com.rn.ddd.infrastructure.engine.constant.OrderStateEnum;

import java.util.List;

/**
 * 流程操作步骤
 *
 * @author 然诺
 * @date 2022/3/5
 */
public interface StateActionStep<T, E> {

    /**
     * 数据准备
     *
     * @param context 状态上下文
     */
    default void prepare(StateContext<E> context) {
    }

    /**
     * 校验
     *
     * @param context 状态上下文
     * @return {@link Result}
     */
    Result<T> check(StateContext<E> context);

    /**
     * 操作
     *
     * @param context   状态上下文
     * @param nextState 下一状态
     * @return {@link Result}
     */
    Result<T> operate(StateContext<E> context, OrderStateEnum nextState);

    /**
     * 数据持久化
     *
     * @param context   状态上下文
     * @param nextState 下一状态
     * @return {@link Result}
     */
    Result<T> persistence(StateContext<E> context, OrderStateEnum nextState);

    /**
     * 后续处理
     *
     * @param context 状态上下文
     * @return {@link Result}
     */
    Result<T> after(StateContext<E> context);

    /**
     * 获取下一状态
     *
     * @param context 状态上下文
     * @return {@link OrderStateEnum}
     */
    OrderStateEnum getNextState(StateContext<E> context);

    List<PluginHandler> getPlugins(StateContext<E> context);

}
